//+------------------------------------------------------------------+
//|                                                 libloaderapi.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <WinAPI/windef.h>

// UI语言枚举结构
struct ENUMUILANG
{
   uint NumOfEnumUILang;          // 枚举的UI语言数量
   uint SizeOfEnumUIBuffer;       // 枚举UI缓冲区大小
   PVOID EnumUIBuffer;            // 枚举UI缓冲区指针
};

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
#import "kernel32.dll"
/// 禁用线程库调用
/// @param lib_module 库模块句柄
/// @return 操作结果
int DisableThreadLibraryCalls(HANDLE lib_module);

/// 查找扩展资源
/// @param module 模块句柄
/// @param type 资源类型
/// @param name 资源名称
/// @param language 语言ID
/// @return 资源信息块句柄
HANDLE FindResourceExW(HANDLE module, const string type, const string name, ushort language);

/// 查找字符串序号
/// @param find_string_ordinal_flags 查找标志
/// @param string_source 源字符串
/// @param source 源字符串长度
/// @param string_value 查找字符串
/// @param value 查找字符串长度
/// @param ignore_case 是否忽略大小写
/// @return 查找结果位置
int FindStringOrdinal(uint find_string_ordinal_flags, const string string_source, int source, 
                      const string string_value, int value, int ignore_case);

/// 释放加载的库
/// @param lib_module 库模块句柄
/// @return 操作结果
int FreeLibrary(HANDLE lib_module);

/// 释放库并退出线程
/// @param lib_module 库模块句柄
/// @param exit_code 退出代码
void FreeLibraryAndExitThread(HANDLE lib_module, uint exit_code);

/// 释放资源
/// @param res_data 资源数据句柄
/// @return 操作结果
int FreeResource(HANDLE res_data);

/// 获取模块文件名
/// @param module 模块句柄
/// @param filename 文件名缓冲区
/// @param size 缓冲区大小
/// @return 文件名长度
uint GetModuleFileNameW(HANDLE module, ushort &filename[], uint size);

/// 获取模块句柄
/// @param module_name 模块名称
/// @return 模块句柄
HANDLE GetModuleHandleW(const string module_name);

/// 获取模块句柄(扩展)
/// @param flags 标志位
/// @param module_name 模块名称
/// @param module 返回的模块句柄
/// @return 操作结果
int GetModuleHandleExW(uint flags, const string module_name, HANDLE &module);

/// 获取过程地址
/// @param module 模块句柄
/// @param proc_name 过程名称
/// @return 过程地址
PVOID GetProcAddress(HANDLE module, uchar &proc_name[]);

/// 加载库(扩展)
/// @param lib_file_name 库文件名
/// @param file 文件句柄
/// @param flags 加载标志
/// @return 库模块句柄
HANDLE LoadLibraryExW(const string lib_file_name, HANDLE file, uint flags);

/// 加载资源
/// @param module 模块句柄
/// @param res_info 资源信息
/// @return 资源数据句柄
HANDLE LoadResource(HANDLE module, HANDLE res_info);

/// 锁定资源
/// @param res_data 资源数据句柄
/// @return 资源数据指针
PVOID LockResource(HANDLE res_data);

/// 获取资源大小
/// @param module 模块句柄
/// @param res_info 资源信息
/// @return 资源大小
uint SizeofResource(HANDLE module, HANDLE res_info);

/// 添加DLL目录
/// @param new_directory 新目录路径
/// @return 目录cookie
PVOID AddDllDirectory(const string new_directory);

/// 移除DLL目录
/// @param cookie 目录cookie
/// @return 操作结果
int RemoveDllDirectory(PVOID cookie);

/// 设置默认DLL目录
/// @param directory_flags 目录标志
/// @return 操作结果
int SetDefaultDllDirectories(uint directory_flags);

/// 枚举资源语言(扩展)
/// @param module 模块句柄
/// @param type 资源类型
/// @param name 资源名称
/// @param enum_func 枚举函数
/// @param param 自定义参数
/// @param flags 标志位
/// @param lang_id 语言ID
/// @return 操作结果
int EnumResourceLanguagesExW(HANDLE module, const string type, const string name, 
                            PVOID enum_func, long param, uint flags, ushort lang_id);

/// 枚举资源名称(扩展)
/// @param module 模块句柄
/// @param type 资源类型
/// @param enum_func 枚举函数
/// @param param 自定义参数
/// @param flags 标志位
/// @param lang_id 语言ID
/// @return 操作结果
int EnumResourceNamesExW(HANDLE module, const string type, PVOID enum_func, 
                         long param, uint flags, ushort lang_id);

/// 枚举资源类型(扩展)
/// @param module 模块句柄
/// @param enum_func 枚举函数
/// @param param 自定义参数
/// @param flags 标志位
/// @param lang_id 语言ID
/// @return 操作结果
int EnumResourceTypesExW(HANDLE module, PVOID enum_func, long param, 
                          uint flags, ushort lang_id);

/// 查找资源
/// @param module 模块句柄
/// @param name 资源名称
/// @param type 资源类型
/// @return 资源信息块句柄
HANDLE FindResourceW(HANDLE module, const string name, const string type);

/// 加载库
/// @param lib_file_name 库文件名
/// @return 库模块句柄
HANDLE LoadLibraryW(const string lib_file_name);

/// 枚举资源名称
/// @param module 模块句柄
/// @param type 资源类型
/// @param enum_func 枚举函数
/// @param param 自定义参数
/// @return 操作结果
int EnumResourceNamesW(HANDLE module, const string type, PVOID enum_func, long param);
#import

#import "user32.dll"
/// 加载字符串资源
/// @param instance 实例句柄
/// @param id 字符串ID
/// @param buffer 字符串缓冲区
/// @param buffer_max 缓冲区大小
/// @return 加载的字符串长度
int LoadStringW(HANDLE instance, uint id, string buffer, int buffer_max);
#import
//+------------------------------------------------------------------+